package socket;

/**
 <p>这个客户端连接到地址为xxx.xxx.xxx.xxx的服务器，端口为10000，并从键盘输入一行信息，发送到服务器，然后接受服务器的返回信息，最后结束会话。
 <p><STRONG>第二步　多个客户同时连接</STRONG></p>
 <p>在实际的网络环境里，同一时间只对一个用户服务是不可行的。一个优秀的网络服务程序除了能处理用户的输入信息，
 还必须能够同时响应多个客户端的连接请求。在java中，实现以上功能特点是非常容易的。</p>
 <p>设计原理：</p>
 <p>主程序监听一端口，等待客户接入；同时构造一个线程类，准备接管会话。当一个Socket会话产生后，将这个会话交给线程处理，然后主程序继续监听
 。运用Thread类或Runnable接口来实现是不错的办法。</p>
 <p>这个程序监听10000端口，并将接入交给CreateServerThread线程运行。CreateServerThread线程接受输入，并将输入回应客户，
 直到客户输入"bye"，线程结束。我们可以在createMessage方法中，对输入进行处理，并产生结果，然后把结果返回给客户。  

 */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server2 extends ServerSocket {
	private static final int SERVER_PORT = 7777;

	public Server2() throws IOException {
		super(SERVER_PORT);
		try {
			while (true) {
				Socket socket = accept();
				new CreateServerThread(socket);
			}
		} catch (IOException e) {
		} finally {
			close();
		}
	}

	// --- CreateServerThread
	class CreateServerThread extends Thread {
		private Socket client;
		private BufferedReader in;
		private PrintWriter out;

		public CreateServerThread(Socket s) throws IOException {
			client = s;
			in = new BufferedReader(new InputStreamReader(
					client.getInputStream(), "UTF-8"));
			out = new PrintWriter(client.getOutputStream(), true);
			out.println("--- Welcome to Socket---");
			start();
		}

		public void run() {
			try {
				// 收到的消息
				String line = in.readLine();
				while (!line.equals("bye")) {
					System.out.println("server:" + line);
					// String msg = createMessage(line);
					// out.println(msg);
					line = in.readLine();
				}
				// 发送消息
				out.println("see you!");
				out.println("bye");
				client.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}

	public static void main(String[] args) throws IOException {
		new Server2();
	}
}